﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;

public partial class AreaCandidato : System.Web.UI.Page
{
    //ObjectContext context = DBContextFactory.GetObjectContext();
    //StatusBar statusbar;

    #region " Load "

    protected void Page_Load(object sender, EventArgs e)
    {

        //statusbar = (StatusBar)this.Page.Master.FindControl("StatusBar");

        if (Session["candidato"] == null)
        {
            //Response.Redirect("Default.aspx");
        }
        else
        {
            //Obtem o objeto candidato que está armazenado na sessão
            //Candidato candiato = (Candidato)Session["candidato"];
            LiteralNome.Text = "Teste";//candiato.Nome;

            //if (candiato.Inscricao.Count > 0)
            //{
            //    //Exibe painel com opções, pois o candidato já possui inscrição
            //    PanelAcompanhamento.Visible = true;
            //    this.GridViewInscricoesDataBind();
            //}
            //else
            //{
            //    //Candidato nunca fez inscrição, exibe painel de opções
            //    PanelNovaInscricao.Visible = true;
            //    this.PreencheDropdownCursos();
            //    this.PreencheDropDownDataHora();

            //}
        }
    }

    #endregion

    #region " DDL "

    protected void PreencheDropdownCursos()
    {
        //ObjectSet<CursoOfertado> cursosOfertados = CursoOfertadoSearcher.FindAll();

        ////Coloca a lista de cursos em órdem alfabetica, baseada na descrição de cada curso

        //cursosOfertados.Sort(delegate(CursoOfertado c1, CursoOfertado c2) { return c1.Curso.Descricao.CompareTo(c2.Curso.Descricao); });

        //foreach (CursoOfertado cursoOfertado in cursosOfertados)
        //{
        //    DropDownListCurso.Items.Add(new ListItem(string.Format("{0} - {1}", cursoOfertado.Curso.Descricao, cursoOfertado.Curso.Turno), cursoOfertado.ID.ToString()));
        //}
    }

    protected void PreencheDropDownDataHora()
    {
        DateTime dataInicioProvas = new DateTime(2011, 12, 16);
        DateTime dataFimProvas = new DateTime(2011, 12, 22);

        #region Datas não permitidas
        //Cria lista de datas não permitidas
        List<DateTime> datasNaoPermitidas = new List<DateTime>();

        //Preenche a lista com as datas onde não pode haver prova
        datasNaoPermitidas.Add(new DateTime(2011, 12, 17));
        datasNaoPermitidas.Add(new DateTime(2011, 12, 18));
        datasNaoPermitidas.Add(new DateTime(2011, 12, 24));
        datasNaoPermitidas.Add(new DateTime(2011, 12, 25));

        #endregion

        #region Dias da semana
        //Cria lista com os dias da semana onde pode haver prova
        List<DayOfWeek> diasDaSemana = new List<DayOfWeek>();

        //Preenche com os dias da semana onde pode haver prova
        diasDaSemana.Add(DayOfWeek.Monday); //segunda
        diasDaSemana.Add(DayOfWeek.Tuesday); //terça
        diasDaSemana.Add(DayOfWeek.Wednesday); //quarta 
        diasDaSemana.Add(DayOfWeek.Thursday); //quinta 
        diasDaSemana.Add(DayOfWeek.Friday); //sexta
        #endregion

        #region Horarios de prova
        //Cria lista com os horários permitidos
        List<TimeSpan> horasDeprova = new List<TimeSpan>();

        //Preenche a lista com o horário o qual podem ocorrer provas
        horasDeprova.Add(new TimeSpan(9, 00, 0)); //09:30
        horasDeprova.Add(new TimeSpan(15, 00, 00));
        horasDeprova.Add(new TimeSpan(19, 00, 00));

        #endregion

        #region Cálculo de dias úteis e dia de agendamento

        //O boleto terá o vencimento para o próximo dia útil
        DateTime proximoDiaUtil = DateTime.Now.AddDays(1); //Util.ProximoDiaUtil(DateTime.Now.Date);

        /* Como a compensação do boleto acontece em até 48 horas,
         * a primeira data possível para o agendamento deve ser 
         * o primeiro dia útil após o vencimentodoboleto.
         * 
         */

        DateTime inicioAgendamento = DateTime.Now.AddDays(3); //Util.ProximoDiaUtil(proximoDiaUtil.AddDays(2));

        #endregion

        #region Preenchimento de datas

        while ((DateTime.Compare(inicioAgendamento, dataFimProvas) < 0) || DateTime.Compare(inicioAgendamento, dataFimProvas) == 0)
        {

            if (diasDaSemana.Contains(inicioAgendamento.DayOfWeek) && !datasNaoPermitidas.Contains(inicioAgendamento)) // é um dia válido para agendamento
            {

                ListItem dataAgendamento = new ListItem(string.Format("{0} - {1}", inicioAgendamento.ToString("d"), inicioAgendamento.ToString("dddd", new CultureInfo("pt-BR"))), inicioAgendamento.ToString("d"));

                DropDownListData.Items.Add(dataAgendamento);


                inicioAgendamento = inicioAgendamento.AddDays(1);
            }
            else
            {
                inicioAgendamento = inicioAgendamento.AddDays(1); // incrementa o dia
            }

        }
        #endregion

        #region Preenchimento de horas

        foreach (TimeSpan horaAgendamento in horasDeprova)
        {
            DropDownListHora.Items.Add(new ListItem(new DateTime(horaAgendamento.Ticks).ToString("HH:mm")));
        }

        #endregion

    }

    #endregion

    #region " Grid "

    protected void GridViewInscricoes_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            string situacaoPagamento = DataBinder.Eval(e.Row.DataItem, "Situacao").ToString();
            Image ImagestatusInscricao = (Image)e.Row.FindControl("ImageStatusInscricao");

            switch (situacaoPagamento)
            {

                case "Pendente":
                    //insere link para o boleto
                    HyperLink linkBoleto = (HyperLink)e.Row.FindControl("HyperLinkBoleto");
                    linkBoleto.NavigateUrl = string.Format("GerarBoleto.aspx?i={0}", DataBinder.Eval(e.Row.DataItem, "ID").ToString()); //Util.Encode(long.Parse(DataBinder.Eval(e.Row.DataItem, "ID").ToString())));
                    linkBoleto.Text = "Imprimir boleto";
                    linkBoleto.Visible = true;

                    //insere a imagem do status
                    ImagestatusInscricao.ImageUrl = "img/icons/icon_clock.png";
                    ImagestatusInscricao.ToolTip = "Pendente - Agurdando confirmação do pagamento.";
                    break;

                case "Confirmada":
                    ImagestatusInscricao.ImageUrl = "img/icons/icon_approve.png";
                    ImagestatusInscricao.ToolTip = "Inscrição confirmada!";

                    break;

                case "Cancelada":
                    ImagestatusInscricao.ImageUrl = "img/icons/icon_error.png";
                    ImagestatusInscricao.ToolTip = "Cancelada - Inscrição cancelada por falta de pagamento.";

                    break;
                default:
                    break;
            }
        }
    }

    protected void GridViewInscricoes_RowDataBound(object sender, EventArgs e)
    {

    }

    protected void GridViewInscricoesDataBind()
    {
        //Candidato candiato = (Candidato)Session["candidato"];

        //GridViewInscricoes.DataSource = InscricaoSearcher.GetByIdCandidato(candiato.ID);
        //GridViewInscricoes.DataBind();

    }

    #endregion

    #region " Botões "

    protected void ButtonInscrever_Click(object sender, EventArgs e)
    {

        //Candidato candiato = (Candidato)Session["candidato"];

        //CursoOfertado cursoOfetado = CursoOfertadoSearcher.GetByPK(int.Parse(DropDownListCurso.SelectedValue));

        bool isento = false;

        #region Verificacao de inseção

        /** no caso do vestibular agendado, o código de isenção é o CPF (somente para candidatos que pagaram
             *  o último vestibular, mas não compareceram
             *  
             *  */

        //Isencao isencao = IsencaoSearcher.GetByCodigo(candiato.CPF);

        //if (isencao != null) // código está na tabela de insenções (código válido)
        //{
        //    //verifica se não foi utilizado
        //    if (isencao.IdInscricao == null)
        //    {
        //        isento = true;
        //    }
        //}



        #endregion

        #region Inscricao

        //ProcessoSeletivo.Business.Inscricao inscricao = new ProcessoSeletivo.Business.Inscricao();

        //inscricao.IdCursoOfertado = int.Parse(DropDownListCurso.SelectedValue);
        //inscricao.IdCandidato = candiato.ID;
        //inscricao.Data = DateTime.Now;

        #endregion

        #region Agendamento

        //Agendamento agendamento = new Agendamento();
        //agendamento.IdCandidato = candiato.ID;
        //agendamento.IdProcessoSeletivo = cursoOfetado.IdProcessoSeletivo;

        DateTime dataSelecionada = DateTime.Parse(DropDownListData.SelectedValue);
        DateTime horaSelecionada = DateTime.Parse(DropDownListHora.SelectedValue);

        DateTime dataHoraAgendamento = new DateTime(dataSelecionada.Year, dataSelecionada.Month, dataSelecionada.Day, horaSelecionada.Hour, horaSelecionada.Minute, horaSelecionada.Second);
        //agendamento.Data = dataHoraAgendamento;





        #endregion

        #region Boleto

        //Boleto boleto = new Boleto();

        //boleto.IdCandidato = candiato.ID;
        //boleto.Valor = 30;
        ////boleto.Vencimento = Util.ProximoDiaUtil(DateTime.Now);
        //boleto.Vencimento = Util.GeraDataVencimento(DateTime.Parse(DropDownListData.SelectedValue));



        #endregion

        #region Processo de Inscrição
        try
        {
            //Inicia a transação
            //context.StartTransaction();


            ////Salva a inscrição no banco
            //context.PersistChanges(inscricao);

            ////Obtem o código de inscrição recém gerado para associarmos ao agendamento e ao boleto
            //ProcessoSeletivo.Business.Inscricao novaInscricao = InscricaoSearcher.GetByDataInscricao(inscricao.Data);

            //int codigoInscricao = novaInscricao.ID;
            //Session["codInscricao"] = codigoInscricao;

            ////Seta os codigo de inscricao no agendamento e no boleto
            //agendamento.IdInscricao = codigoInscricao;
            //boleto.IdInscricao = codigoInscricao;


            //context.PersistChanges(agendamento);

            ////Se o candidato é isento, seta o código de inscrição no objeto de insenção e salva, caso contrário, gera o boleto
            //if (isento)
            //{

            //    isencao.IdInscricao = codigoInscricao;
            //    context.PersistChanges(isencao);
            //}
            ////candidato não é isento, gera boleto
            //else
            //{

            //    context.PersistChanges(boleto);
            //}

            ////Confirma a transação no banco
            //context.Commit();

            ////Atualiza a sessão candidato com o objeto candidato preenchido (com a informação da inscrição recém criada)
            //Session["candidato"] = CandidatoSearcher.GetByPK(candiato.ID);



            ////Exibe mensagem de sucesso e link para boleto
            //statusbar.Type = StatusBar.StatusType.Success;
            //statusbar.Modal = true;

            //// Escolhe qual mensagem será exibida de acordo com o candidato
            //if (isento)
            //{
            //    statusbar.Message = "Inscrição realizada com sucesso! Você foi isento da taxa inscrição. Compareça na data e hora agendada e boa sorte! Pense grande, faça Social!";
            //}
            //else
            //{
            //    statusbar.Message = String.Format("Inscrição realizada com sucesso! Selecione a opção <a href=\"GerarBoleto.aspx?i={0}\"> \"Imprimir boleto\" </a> para imprimir e pagar a taxa de inscrição.", Util.Encode(codigoInscricao).ToString());
            //}


            ////Esconde o painel de nova inscrição
            //PanelNovaInscricao.Visible = false;
            //PanelAcompanhamento.Visible = true;

            ////atualiza o grid de inscrições
            //this.GridViewInscricoesDataBind();
        }
        catch (Exception ex)
        {
            //context.Rollback();
            //Session["codInscricao"] = null;


            ////Exibe mensagem de erro
            //statusbar.Type = StatusBar.StatusType.Error;
            //statusbar.Modal = true;
            //statusbar.Message = string.Format("Não foi possível realizar a sua inscrição. {0} Favor tentar novamente. Caso o erro persista, favor entrar em contato com a Faculdade Social.", ex.Message);
        }

        #endregion

        #region Envio de e-mail

        // Envia e-mail de confirmação
        try
        {
            // Se não for isento, envia um e-mail com o boleto
            if (!isento)
            {
                //this.sendMailNovaInscricao(inscricao, agendamento, boleto);
            }
        }
        catch (Exception ex)
        {

            //statusbar.Message = ex.Message + ex.StackTrace + ex.Data;
            //statusbar.Type = StatusBar.StatusType.Error;
        }



        #endregion

        #region Envio de SMS
        try
        {
            //if (Util.IsTelefoneCelular(candiato.Celular))
            //{
            //    /*SMS sms = new SMS();
            //    string mensagem = String.Format("Vestibular agendado para {0:ddd}-{0:d} {1:t}h. Efetue o pagamento ate {2:d} e garanta a sua participacao. Pense grande, faca Social!", agendamento.Data, agendamento.Data, boleto.Vencimento);
            //    sms.Send(candiato.Celular, mensagem);*/

            //    WebServiceFreedomSMS freedomSMS = new WebServiceFreedomSMS();

            //    MensagemRQ sms = new MensagemRQ();
            //    sms.Login = "social";
            //    sms.Senha = "010203";
            //    sms.Remetente = "FAC. SOCIAL";

            //    //Escolhe qual mensagem SMS devrá ser enviada
            //    if (isento)
            //    {
            //        sms.Mensagem = String.Format("Vestibular agendado para {0:ddd}-{0:d} {1:t}h. Compareca na data escolhida e garanta a sua participacao. Pense grande, faca Social!", agendamento.Data, agendamento.Data);
            //    }
            //    else
            //    {
            //        sms.Mensagem = String.Format("Vestibular agendado para {0:ddd}-{0:d} {1:t}h. Efetue o pagamento ate {2:d} e garanta a sua participacao. Pense grande, faca Social!", agendamento.Data, agendamento.Data, boleto.Vencimento);

            //    }


            //    NumeroRQ celular = new NumeroRQ();
            //    celular.Numero = string.Format("55{0}", candiato.Celular);


            //    NumeroRQ[] destinos = new NumeroRQ[1];
            //    destinos[0] = celular;

            //    sms.ListNumeros = destinos;

            //    MensagemRS retorno = freedomSMS.EnviarSMS(sms);

            //    /* if (retorno.Erro)
            //     {
            //         throw new Exception(retorno.MensagemRetorno);
            //     }*/

            //}
        }
        catch (Exception exsms)
        {
            //statusbar.Message = exsms.Message;
            //statusbar.Type = StatusBar.StatusType.Error;

        }
        #endregion


    }

    protected void ButtonNovaInscricao_Click(object sender, EventArgs e)
    {
        PanelAcompanhamento.Visible = false;

        this.PreencheDropdownCursos();
        this.PreencheDropDownDataHora();

        PanelNovaInscricao.Visible = true;
    }

    #endregion

    #region " Send "

    //public void sendMailNovaInscricao(ProcessoSeletivo.Business.Inscricao inscricao, Agendamento agendamento, Boleto boleto)
    //{
    //    //try
    //    //{
    //    SmtpClient client = new SmtpClient();
    //    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    //    client.EnableSsl = true;
    //    client.Host = "smtp.gmail.com";
    //    client.Port = 587;

    //    // setup Smtp authentication                
    //    System.Net.NetworkCredential credentials = new System.Net.NetworkCredential("portal@faculdadesocial.edu.br", "isba!@ba");
    //    client.UseDefaultCredentials = false;
    //    client.Credentials = credentials;

    //    //
    //    MailDefinition message = new MailDefinition();

    //    message.BodyFileName = "mailTemplateNovaInscricao.htm";
    //    message.IsBodyHtml = true;
    //    message.From = "Faculdade Social<portal@faculdadesocial.edu.br>";
    //    message.Subject = "Sua inscrição no Processo Seletivo 2011.2 - Agendado";

    //    //Replacements dos placeholders da mensagem
    //    //Build replacement collection to replace fields in email.htm file
    //    ListDictionary replacements = new ListDictionary();
    //    //string[] nome = nomeAluno.Split(' ');
    //    replacements.Add("<%curso%>", inscricao.CursoOfertado.Curso.Descricao);
    //    replacements.Add("<%turno%>", inscricao.CursoOfertado.Curso.Turno);
    //    replacements.Add("<%agendamento_data%>", agendamento.Data.ToString("D"));
    //    replacements.Add("<%agendamento_hora%>", agendamento.Data.ToString("t"));
    //    replacements.Add("<%inscricao_id%>", Util.Encode(inscricao.ID));
    //    replacements.Add("<%vencimento_boleto%>", boleto.Vencimento.ToString("d"));

    //    /*embed images for the email
    //    EmbeddedMailObject imageObject = new EmbeddedMailObject();
    //    imageObject.Path = Server.MapPath(@"resources/images/logo_mail.gif");
    //    imageObject.Name = "logo";
    //    message.EmbeddedObjects.Add(imageObject);*/

    //    //Escolher o Destinatario, a Lista de Campos do Email
    //    MailMessage msgHtml = message.CreateMailMessage("portal@faculdadesocial.edu.br", replacements, new LiteralControl());
    //    msgHtml.To.Add(inscricao.Candidato.Email);

    //    //Anexa a imagem
    //    //LinkedResource imageLogo = new LinkedResource(Server.MapPath(@"img/logo.png"), "image/png");
    //    //imageLogo.ContentId = "logo";
    //    //imageLogo.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;

    //    AlternateView htmlView = AlternateView.CreateAlternateViewFromString(msgHtml.Body, null, "text/html");
    //    msgHtml.AlternateViews.Add(htmlView);
    //    //htmlView.LinkedResources.Add(imageLogo);

    //    object userState = message;



    //    //Envia o Email

    //    //client.SendAsync(msgHtml, userState);
    //    client.Send(msgHtml);

    //    //}
    //    //catch (Exception ex)
    //    //{
    //    //    throw new Exception(ex.InnerException.Message);
    //    //}

    //}

    #endregion
}